https://eduard-martinez.github.io
R es el lenguaje de programación y el motor de cálculo; RStudio es la interfaz gráfica que facilita trabajar con ese motor.
R (motor de cálculo)
RStudio (IDE)
La consola constituye el espacio donde se introducen instrucciones y
se observa de inmediato el resultado de la evaluación. Cada línea
comienza con el símbolo de promp >; al pulsar
Enter se ejecuta la instrucción y, debajo, se imprime el valor
devuelto o un mensaje de advertencia o error según corresponda. En la
parte superior se visualiza el historial de comandos, lo que permite
reutilizar expresiones previas mediante las flechas del teclado o la
función history().
RStudio abre, por defecto, una ventana dividida en cuatro paneles principales, cada uno asociado a una fase del flujo de trabajo:
Warning), mensajes
(Message) y errores (Error).history().Después de ejecutar una línea de código en R, la consola puede retornar un decoding messages. Estos pueden ser: Warning o message: sugiere que hay detalles de la función que debemos tener en cuenta (no se detiene la ejecución de la función). Error: se genera cuando ocurrió un error importante causando que la función no continue ejecutándose.
?función) y viñetas (vignette()).Antes de trabajar con objetos en R, es útil familiarizarse con algunas operaciones básicas y cómo imprimir resultados en la consola. R permite ejecutar operaciones aritméticas, lógicas y de comparación de manera sencilla. A continuación, exploraremos estos conceptos clave.
R reconoce los operadores aritméticos estándar:
| Operador | Descripción | Ejemplo |
|---|---|---|
+
|
Suma | 3 + 2 # 5 |
-
|
Resta | 7 - 4 # 3 |
*
|
Multiplicación | 6 * 3 # 18 |
/
|
División | 8 / 2 # 4 |
^, **
|
Exponenciación | 2^3 # 8 |
%%
|
Módulo (resto de división) | 10 %% 3 # 1 |
%/%
|
División entera | 10 %/% 3 # 3 |
%*%
|
Multiplicación matricial | A %*% B |
%o%
|
Producto exterior | x %o% y |
%x%
|
Producto Kronecker | A %x% B |
Ejemplo de operaciones básicas:
1 + 2 # Suma
## [1] 3
5 / 2 # División
## [1] 2.5
(2 + 4) * 1^3 # Uso de paréntesis para controlar la precedencia
## [1] 6
Orden de precedencia en operaciones aritméticas en R: 1.
^ (exponentes) 2. * y /
(multiplicación y división) 3. + y - (suma y
resta)
Ejemplo de precedencia:
3 + 2 * 4 # Multiplicación antes de la suma (resultado: 11)
## [1] 11
(3 + 2) * 4 # Uso de paréntesis para cambiar precedencia (resultado: 20)
## [1] 20
100 %/% 60 # ¿Cuántas horas enteras hay en 100 minutos?
## [1] 1
100 %% 60 # ¿Cuántos minutos quedan?
## [1] 40
R incluye operadores lógicos para evaluar condiciones:
| Operador | Descripción | Ejemplo |
|---|---|---|
< , >
|
Menor y mayor que | 5 > 3 # TRUE |
<= , >=
|
Menor o igual y mayor igual que | 5 >= 5 # TRUE |
==
|
Igual a | 3 == 3 # TRUE |
!=
|
Diferente de | 3 != 4 # TRUE |
&
|
y (AND lógico) | TRUE & FALSE # FALSE |
|
|
o (OR lógico) | TRUE | FALSE # TRUE |
!
|
Negación lógica | !TRUE # FALSE |
Ejemplo de evaluación lógica:
1 > 2 # ¿Es 1 mayor que 2?
## [1] FALSE
1 > 2 & 1 > 0.5 # ¿Es 1 mayor que 2 y mayor que 0.5?
## [1] FALSE
1 > 2 | 1 > 0.5 # ¿Es 1 mayor que 2 o mayor que 0.5?
## [1] TRUE
isTRUE(1 < 2) # Devuelve TRUE si la condición es cierta
## [1] TRUE
Precaución con la precedencia:
Los operadores relacionales (>, ==) se
evalúan antes que los operadores booleanos (&,
|).
1 > 0.5 & 2 # ¿Qué pasa aquí?
## [1] TRUE
Para evitar confusión, siempre compare valores explícitamente:
1 > 0.5 & 1 > 2 # Evaluación correcta
## [1] FALSE
%in%Para verificar si un elemento está contenido en un conjunto, usamos
%in%:
4 %in% 1:10 # ¿Está 4 en la secuencia del 1 al 10?
## [1] TRUE
4 %in% 5:10 # ¿Está 4 en la secuencia del 5 al 10?
## [1] FALSE
También podemos evaluar igualdad con ==:
0.1 + 0.2 == 0.3 # ¿Esperas que sea TRUE?
## [1] FALSE
Problema: Las computadoras representan números en base 2, lo que puede generar errores de precisión. Más información en este enlace.
Solución: Para comparar valores decimales, usa
all.equal() en lugar de ==:
all.equal(0.1 + 0.2, 0.3) # Evalúa correctamente
## [1] TRUE
Las librerías son un conjunto/paquete de funciones especializadas en tareas específicas.
Una librería se debe instalar en el equipo solo una vez
-install.packages()-, pero se debe llamar/requerir
-library() o require()- cada vez que se inicia
una sesión de Rstudio en la que se va a utilizar alguna
función de esa librería.
Algunas librerías se actualizan constantemente, usted puede
actualizar la versión de una librería usando la función
update.packages().
Nota: puede inspeccionar las librerías que tiene
activas en su sesión corriendo la función sessionInfo()
sobre la consola de R:
## información de la sesión
sessionInfo()
R version 4.3.1 (2023-06-16)
Platform: x86_64-apple-darwin20 (64-bit)
Running under: macOS Monterey 12.6.6
Matrix products: default
BLAS: /System/Library/Frameworks/Accelerate.framework/Versions/A/Frameworks/vecLib.framework/Versions/A/libBLAS.dylib
LAPACK: /Library/Frameworks/R.framework/Versions/4.3-x86_64/Resources/lib/libRlapack.dylib; LAPACK version 3.11.0
locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
Cuando inicia sesión, R carga 7 librerías bases
(usted,stats,graphics,grDevices,utils,
datasets, methods y base). Pero
usted puede instalar/llamar cerca de 22498 librerías disponibles en el
CRAN de R.
¿Como instalar/actualizar una librería?
Una función permite crear, editar, transformar o eliminar objetos. Están contenidas en librerías. Y cada función contiene por lo menos 1 argumento.
NOTA: Toda función abre con ( y debe cerrar con un ). Aseguresé de ejecutar la función así, para que R entienda hasta que punto debe ejecutar esa funcíon.
Para obtener más información sobre una función u objeto (con nombre)
en R, consulte la documentación de “help” o usando ?:
help(rnorm)
?rnorm
Hint: Los comentarios en R están delimitados por
#. Presiona Ctrl+Shift+c en RStudio para
(des)comentar secciones completas del código resaltado.
Hint: ¿Ves la sección Ejemplos en la parte
inferior del archivo de ayuda? Puedes ejecutarlos con la función
example().
example(rnorm)
Para muchos paquetes, también puede probar la función
vignette(), que proporcionará una introducción a un paquete
y su propósito a través de una serie de ejemplos útiles. Una
complicación es que necesita saber el nombre exacto de la(s) viñeta(s)
del paquete. Intente ejecutar:
vignette("base")
Al igual que las viñetas, muchos paquetes vienen con demostraciones interactivas integradas. Para enumerar todas las demostraciones disponibles en su sistema:
demo("graphics", package = "graphics")
demo(package = .packages(all.available = TRUE))
Para asignar un objeto se debe seguir la siguiente estructura:
nombre_objeto + asignar + funcion()
# Una forma de hacerlo:
data_1 <- rnorm(n = 10 , mean = 50 , sd = 10)
# Otra forma de hacerlo:
data_2 = rnorm(n = 10 , mean = 40 , sd = 10)
¿Qué operador de asignación usar?
La mayoría de los usuarios de R (¿puristas?) parecen preferir
<- para la asignación, ya que = también
tiene un papel específico para la evaluación dentro de las
funciones.
Veremos muchos ejemplos de esto más adelante.
Pero no creo que importe; = es más rápido de
escribir y es más intuitivo si vienes de otro lenguaje de programación.
(Más discusión aquí)
Conclusión: Usa lo que prefieras. Solo sé consistente dentro de tu propio código. i.e: Usa el mismo operador en la medida de lo posible.
También puede asignar objetos usando la siguiente estructura:
x1 <- 2 + 2
x1
## [1] 4
assign("x2", 3/6)
x2
## [1] 0.5
3*4 -> x3
x3
## [1] 12
Es importante enfatizar que hay muchos tipos (o clases) diferentes de objetos.
Volveremos a examinar el tema de “tipo” frente a “clase” en una o dos diapositivas. Por el momento, es útil simplemente nombrar algunos objetos con los que trabajaremos regularmente:
Cada clase de objeto tiene su propio conjunto de reglas (“métodos”) para determinar operaciones válidas. Por ejemplo, aunque hay operaciones que funcionan en matrices y dataframes, también hay algunas operaciones que solo funcionan en una matriz, y viceversa. Al mismo tiempo, puede (generalmente) convertir un objeto de un tipo a otro.
## Crea un dataframe llamado "df".
df = data.frame(x = 1:2, y = 3:4)
df
## x y
## 1 1 3
## 2 2 4
## Convertirlo en una matriz "mt".
mt = as.matrix(df)
mt
Puede inspeccionar/imprimir un objeto directamente en la consola debe
escribir df en la consola o puede usar la función
View(df) para verlo en el editor de datos.
Usar class, typeof, y str para
conocer más acerca de un objeto.
class(df) ## Evaluate its class.
## [1] "data.frame"
typeof(df) ## Evaluate its type.
## [1] "list"
str(df) ## Show its structure.
## 'data.frame': 2 obs. of 2 variables:
## $ x: int 1 2
## $ y: int 3 4
Podemos asignar objetos a diferentes nombres. Sin embargo, hay una serie de palabras especiales que están “reservadas” en R. Estos son comandos, operadores y relaciones fundamentales en base R que no se pueden (re)asignar (aunque se quisiera). Consulte una lista completa aquí.
Algunas de las palabras que no se pueden usar:
if
else
while
function
for
TRUE
FALSE
NULL
Inf
NaN
NA
Además de la lista de palabras estrictamente reservadas, existe otro conjunto de palabras que, aunque se reasignar pero que es mejor no usarlas.
Por ejemplo: c() se usa para concatenar; es decir, crear
vectores y unir diferentes objetos.
c = 4
c(1, 2, 5)
Afortunadamente nada. R es lo suficientemente “inteligente” para
distinguir entre la variable c = 4 que creamos y la función
integrada c() que requiere concatenación.
¿Qué pasa si usamos comillas para nombrar un objeto?
"hola" = 2
hola
El espacio de trabajo es la colección de objetos almacenados en la memoria activa de R. Para gestionar el espacio de trabajo puede:
objects() ## ver objetos en el espacio de trabajo
## [1] "df" "my_tbl" "x1" "x2" "x3"
object.size(mtcars) ## peso de un objeto
## 7208 bytes
ls() ## ver objetos en el espacio de trabajo
## [1] "df" "my_tbl" "x1" "x2" "x3"
Puede remover uno o varios objetos del espacio de trabajo:
rm() ## remover un objeto del espacio de trabajo
rm(list=ls()) ## Limpiar el entorno de trabajo
cat("\f") ## Limpiar la consola
save.image("~/Clase-02.RData") ## Guardar espacio de trabajo
En R puede encontrar distintos tipos de datos. Los más comunes son los datos numéricos, texto y lógicos.
# Numericos
is.numeric(10)
## [1] TRUE
# Las cadenas de caracteres se escriben entre " " o entre ''
is.character("Hola")
## [1] TRUE
is.numeric("10")
## [1] FALSE
# Lógicos (TRUE,FALSE,NA,NULL)
is(TRUE)
## [1] "logical" "vector"
is(Inf)
## [1] "numeric" "vector"
is(NULL)
## [1] "NULL" "OptionalFunction" "optionalMethod"
Los vectores y las matrices son objetos homogéneos. Es decir, todos los elementos de estos objeto deben ser del mismo tipo (numérico o carácter o lógico). Sim embargo, mientras los vectores son de una dimensión las matrices tienen dos dimensiones (filas y columnas).
La indexación en R comienza en 1. No 0 como en algunos lenguajes (por
ejemplo, Python y JavaScript). Podemos usar [] para indexar
objetos que creamos en R.
a = c(10 , 20 , 30 , 40 , 50 , 60)
a[4] # obtener el cuarto elemento del objeto "a"
## [1] 40
a[2:3] # maneter elementos de la posición 2 a la 3
## [1] 20 30
a[-3] # eliminar el tercer elemento
## [1] 10 20 40 50 60
Usando operadores lógicos o aritméticos
x = c(NA,1,2,3,4,5,NA)
x[!is.na(x)] # Diferentes de NA
## [1] 1 2 3 4 5
x[x>3] # Mayores a 3 (Ojo con los NA)
## [1] NA 4 5 NA
x[x %in% 1:3] # Contenidos en 1 a 3
## [1] 1 2 3
length(x) # largo del vector
## [1] 7
class(x) # clase
## [1] "numeric"
str(x) # estructura del dato
## num [1:7] NA 1 2 3 4 5 NA
object.size(x) # tamaño
## 112 bytes
x <- c(1 , 2 , 3 , 4 , 5)
is.numeric(x)
## [1] TRUE
Generar secuencias regulares:
x = 1:5
x
## [1] 1 2 3 4 5
x1 = seq(-5, 5, by=2)
x1
## [1] -5 -3 -1 1 3 5
x2 <- rep(x, times=5)
x2
## [1] 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5
x3 <- rep(x, each=5)
x3
## [1] 1 1 1 1 1 2 2 2 2 2 3 3 3 3 3 4 4 4 4 4 5 5 5 5 5
Algunos operadores que se pueden aplicar: +,
-, *, /, ^,
sum(), mean(), min()…
sum(x) ; length(x) ; prod(x) ; mean(x)
## [1] 15
## [1] 5
## [1] 120
## [1] 3
logi = c(TRUE,NA,FALSE,NULL)
logi
## [1] TRUE NA FALSE
# aplicar un operador
logi = 1:5 >= 3
logi
## [1] FALSE FALSE TRUE TRUE TRUE
¿Cuál es la diferencia entre NA, NaN y
NULL?
x = c(1:3,NA,0/0,NULL,Inf,-Inf)
x
## [1] 1 2 3 NA NaN Inf -Inf
is.na(x)
## [1] FALSE FALSE FALSE TRUE TRUE FALSE FALSE
is(0/0)
## [1] "numeric" "vector"
Puede usarse " o ' para escribir una cadena
de caracteres en R:
x = c("Hola-","Mundo-","10-")
x
## [1] "Hola-" "Mundo-" "10-"
Pueden concatenarse cadenas de caracteres usando la función
paste() o paste0()
y = paste(x, 1:5, sep = "")
y
## [1] "Hola-1" "Mundo-2" "10-3" "Hola-4" "Mundo-5"
x = matrix(data = 1:9 , nrow=3 , ncol=3)
x
## [,1] [,2] [,3]
## [1,] 1 4 7
## [2,] 2 5 8
## [3,] 3 6 9
y = matrix(data = c("hola","mundo") , nrow=2 , ncol=2)
y
## [,1] [,2]
## [1,] "hola" "hola"
## [2,] "mundo" "mundo"
attributes(x) # atributos
## $dim
## [1] 3 3
class(x) # clase
## [1] "matrix" "array"
str(x) # tipo de dato
## int [1:3, 1:3] 1 2 3 4 5 6 7 8 9
Las matrices tienen dos dimensiones [i,j], siendo
i y j la la i-ésima fila y j-ésima la columna
respectivamente.
x[1,] # Obtener la fila 1
## [1] 1 4 7
x[,3] # Obtener la columna 3
## [1] 7 8 9
x[2,2] # Obtener elemento de la fila y columna 2
## [1] 5
x[x<4] = NA
x
## [,1] [,2] [,3]
## [1,] NA 4 7
## [2,] NA 5 8
## [3,] NA 6 9
Los dataframes son objetos heterogéneos de dos dimensiones. Es decir, puede almacenar elementos de diferentes tipos (numéricos, caracteres y lógicos al mismo tiempo) y tiene dos dimensiones (filas y columnas).
Conjuntos de datos disponibles en la memoria de R
data(package="datasets")
Data sets in package ‘datasets’:
iris Edgar Anderson´s Iris Data
iris3 Edgar Anderson´s Iris Data
islands Areas of the World´s Major Landmasses
ldeaths (UKLungDeaths) Monthly Deaths from Lung Diseases in the UK
lh Luteinizing Hormone in Blood Samples
longley Longley´s Economic Regression Data
lynx Annual Canadian Lynx trappings 1821-1934
mdeaths (UKLungDeaths) Monthly Deaths from Lung Diseases in the UK
morley Michelson Speed of Light Data
mtcars Motor Trend Car Road Tests
uspop Populations Recorded by the US Census
volcano Topographic Information on Auckland´s Maunga Whau Volcano
women Average Heights and Weights for American Women
Se muestran solo algunos de los 104 conjuntos de datos disponibles en
la librería datasets.
df = as.data.frame(mtcars)
df
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
## Mazda RX4 Wag 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
## Datsun 710 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
## Hornet 4 Drive 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
## Hornet Sportabout 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
## Valiant 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
## Duster 360 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
## Merc 240D 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
## Merc 230 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
## Merc 280 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
En las próximas clases aprenderemos a crear dataframes importando a R conjuntos de datos desde nuestros equipos (.csv, .xlsx, .txt,…).
colnames(df) # acceder a los nombres de las variables/columnas
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
attributes(df) # Ver atributos
## $names
## [1] "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear"
## [11] "carb"
##
## $row.names
## [1] "Mazda RX4" "Mazda RX4 Wag" "Datsun 710"
## [4] "Hornet 4 Drive" "Hornet Sportabout" "Valiant"
## [7] "Duster 360" "Merc 240D" "Merc 230"
## [10] "Merc 280" "Merc 280C" "Merc 450SE"
## [13] "Merc 450SL" "Merc 450SLC" "Cadillac Fleetwood"
## [16] "Lincoln Continental" "Chrysler Imperial" "Fiat 128"
## [19] "Honda Civic" "Toyota Corolla" "Toyota Corona"
## [22] "Dodge Challenger" "AMC Javelin" "Camaro Z28"
## [25] "Pontiac Firebird" "Fiat X1-9" "Porsche 914-2"
## [28] "Lotus Europa" "Ford Pantera L" "Ferrari Dino"
## [31] "Maserati Bora" "Volvo 142E"
##
## $class
## [1] "data.frame"
dim(df) # dimensiones
## [1] 32 11
str(df) # Estructura
## 'data.frame': 32 obs. of 11 variables:
## $ mpg : num 21 21 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 ...
## $ cyl : num 6 6 4 6 8 6 8 4 4 6 ...
## $ disp: num 160 160 108 258 360 ...
## $ hp : num 110 110 93 110 175 105 245 62 95 123 ...
## $ drat: num 3.9 3.9 3.85 3.08 3.15 2.76 3.21 3.69 3.92 3.92 ...
## $ wt : num 2.62 2.88 2.32 3.21 3.44 ...
## $ qsec: num 16.5 17 18.6 19.4 17 ...
## $ vs : num 0 0 1 1 0 1 0 1 1 1 ...
## $ am : num 1 1 1 0 0 0 0 0 0 0 ...
## $ gear: num 4 4 4 3 3 3 3 4 4 4 ...
## $ carb: num 4 4 1 1 2 1 4 2 2 4 ...
Los dataframes tienen dos dimensiones [i,j], siendo
i y j la la i-ésima fila y j-ésima la columna
respectivamente.
df[1,] # Obtener la fila 1
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
df[,3] # Obtener la columna 3
## [1] 160.0 160.0 108.0 258.0 360.0 225.0 360.0 146.7 140.8 167.6 167.6 275.8
## [13] 275.8 275.8 472.0 460.0 440.0 78.7 75.7 71.1 120.1 318.0 304.0 350.0
## [25] 400.0 79.0 120.3 95.1 351.0 145.0 301.0 121.0
df[2,2] # Obtener elemento de la fila y columa 2
## [1] 6
df$wt
## [1] 2.620 2.875 2.320 3.215 3.440 3.460 3.570 3.190 3.150 3.440 3.440 4.070
## [13] 3.730 3.780 5.250 5.424 5.345 2.200 1.615 1.835 2.465 3.520 3.435 3.840
## [25] 3.845 1.935 2.140 1.513 3.170 2.770 3.570 2.780
df[,1]
## [1] 21.0 21.0 22.8 21.4 18.7 18.1 14.3 24.4 22.8 19.2 17.8 16.4 17.3 15.2 10.4
## [16] 10.4 14.7 32.4 30.4 33.9 21.5 15.5 15.2 13.3 19.2 27.3 26.0 30.4 15.8 19.7
## [31] 15.0 21.4
df[1,] # Obtener primera fila
## mpg cyl disp hp drat wt qsec vs am gear carb
## Mazda RX4 21 6 160 110 3.9 2.62 16.46 0 1 4 4
df[1:3,1:4] # Obtener las primeras 4 filas/columnas
## mpg cyl disp hp
## Mazda RX4 21.0 6 160 110
## Mazda RX4 Wag 21.0 6 160 110
## Datsun 710 22.8 4 108 93
Remover de la fila 1 a la fila 10
x = df[-1:-10,] # Remover primeras 10 filas
x
## mpg cyl disp hp drat wt qsec vs am gear carb
## Merc 280C 17.8 6 167.6 123 3.92 3.440 18.90 1 0 4 4
## Merc 450SE 16.4 8 275.8 180 3.07 4.070 17.40 0 0 3 3
## Merc 450SL 17.3 8 275.8 180 3.07 3.730 17.60 0 0 3 3
## Merc 450SLC 15.2 8 275.8 180 3.07 3.780 18.00 0 0 3 3
## Cadillac Fleetwood 10.4 8 472.0 205 2.93 5.250 17.98 0 0 3 4
## Lincoln Continental 10.4 8 460.0 215 3.00 5.424 17.82 0 0 3 4
## Chrysler Imperial 14.7 8 440.0 230 3.23 5.345 17.42 0 0 3 4
## Fiat 128 32.4 4 78.7 66 4.08 2.200 19.47 1 1 4 1
## Honda Civic 30.4 4 75.7 52 4.93 1.615 18.52 1 1 4 2
## Toyota Corolla 33.9 4 71.1 65 4.22 1.835 19.90 1 1 4 1
## Toyota Corona 21.5 4 120.1 97 3.70 2.465 20.01 1 0 3 1
## Dodge Challenger 15.5 8 318.0 150 2.76 3.520 16.87 0 0 3 2
## AMC Javelin 15.2 8 304.0 150 3.15 3.435 17.30 0 0 3 2
## Camaro Z28 13.3 8 350.0 245 3.73 3.840 15.41 0 0 3 4
## Pontiac Firebird 19.2 8 400.0 175 3.08 3.845 17.05 0 0 3 2
## Fiat X1-9 27.3 4 79.0 66 4.08 1.935 18.90 1 1 4 1
## Porsche 914-2 26.0 4 120.3 91 4.43 2.140 16.70 0 1 5 2
## Lotus Europa 30.4 4 95.1 113 3.77 1.513 16.90 1 1 5 2
## Ford Pantera L 15.8 8 351.0 264 4.22 3.170 14.50 0 1 5 4
## Ferrari Dino 19.7 6 145.0 175 3.62 2.770 15.50 0 1 5 6
## Maserati Bora 15.0 8 301.0 335 3.54 3.570 14.60 0 1 5 8
## Volvo 142E 21.4 4 121.0 109 4.11 2.780 18.60 1 1 4 2
tibble() o data.frame()vignette("tibble")
## Tibbles
Tibbles are a modern take on data frames. They keep the features that have stood
the test of time, and drop the features that used to be convenient but are now
frustrating (i.e. converting character vectors to factors).
...
## Tibbles vs data frames
There are three key differences between tibbles and data frames: printing,
subsetting, and recycling rules.
Es más eficiente (computacionalmente) trabajar con objetos
tbl
tb = tibble::as_tibble(df)
class(tb)
## [1] "tbl_df" "tbl" "data.frame"
tb
## # A tibble: 32 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
## 6 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 7 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 8 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 9 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 10 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
## # ℹ 22 more rows
Las listas son objetos heterogéneos de una dimensión. Es decir, en una lista se puede almacenar diferentes tipos de objetos (vectores, matrices, dataframes y listas) pero al igual que los vectores tienen solo una dimensión (fila o columna).
lista = list("tibble_1"=tb[1:5,],
"tibble_2"=tb[6:10,]) # Asignar nombre a cada posición dentro de la lista
lista[[3]] = tb[11:nrow(tb),] # Almacenar en la tercera posición
lista
## $tibble_1
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
##
## $tibble_2
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 2 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 3 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 4 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 5 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
##
## [[3]]
## # A tibble: 22 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 17.8 6 168. 123 3.92 3.44 18.9 1 0 4 4
## 2 16.4 8 276. 180 3.07 4.07 17.4 0 0 3 3
## 3 17.3 8 276. 180 3.07 3.73 17.6 0 0 3 3
## 4 15.2 8 276. 180 3.07 3.78 18 0 0 3 3
## 5 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4
## 6 10.4 8 460 215 3 5.42 17.8 0 0 3 4
## 7 14.7 8 440 230 3.23 5.34 17.4 0 0 3 4
## 8 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
## 9 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
## 10 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
## # ℹ 12 more rows
length(lista) # dimensiones
## [1] 3
names(lista) # nombres de los elementos
## [1] "tibble_1" "tibble_2" ""
names(lista)[3] = "tibble_3" # Asignar nombre al elemento 3
attributes(lista) # Ver atributos
## $names
## [1] "tibble_1" "tibble_2" "tibble_3"
La indexación en las listas requiere dos [[]]
lista[[4]] = letters
head(lista)
## $tibble_1
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
##
## $tibble_2
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 2 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 3 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 4 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 5 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
##
## $tibble_3
## # A tibble: 22 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 17.8 6 168. 123 3.92 3.44 18.9 1 0 4 4
## 2 16.4 8 276. 180 3.07 4.07 17.4 0 0 3 3
## 3 17.3 8 276. 180 3.07 3.73 17.6 0 0 3 3
## 4 15.2 8 276. 180 3.07 3.78 18 0 0 3 3
## 5 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4
## 6 10.4 8 460 215 3 5.42 17.8 0 0 3 4
## 7 14.7 8 440 230 3.23 5.34 17.4 0 0 3 4
## 8 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
## 9 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
## 10 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
## # ℹ 12 more rows
##
## [[4]]
## [1] "a" "b" "c" "d" "e" "f" "g" "h" "i" "j" "k" "l" "m" "n" "o" "p" "q" "r" "s"
## [20] "t" "u" "v" "w" "x" "y" "z"
lista = lista[-4]
head(lista)
## $tibble_1
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
##
## $tibble_2
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 18.1 6 225 105 2.76 3.46 20.2 1 0 3 1
## 2 14.3 8 360 245 3.21 3.57 15.8 0 0 3 4
## 3 24.4 4 147. 62 3.69 3.19 20 1 0 4 2
## 4 22.8 4 141. 95 3.92 3.15 22.9 1 0 4 2
## 5 19.2 6 168. 123 3.92 3.44 18.3 1 0 4 4
##
## $tibble_3
## # A tibble: 22 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 17.8 6 168. 123 3.92 3.44 18.9 1 0 4 4
## 2 16.4 8 276. 180 3.07 4.07 17.4 0 0 3 3
## 3 17.3 8 276. 180 3.07 3.73 17.6 0 0 3 3
## 4 15.2 8 276. 180 3.07 3.78 18 0 0 3 3
## 5 10.4 8 472 205 2.93 5.25 18.0 0 0 3 4
## 6 10.4 8 460 215 3 5.42 17.8 0 0 3 4
## 7 14.7 8 440 230 3.23 5.34 17.4 0 0 3 4
## 8 32.4 4 78.7 66 4.08 2.2 19.5 1 1 4 1
## 9 30.4 4 75.7 52 4.93 1.62 18.5 1 1 4 2
## 10 33.9 4 71.1 65 4.22 1.84 19.9 1 1 4 1
## # ℹ 12 more rows
lista[[1]] # usando la posición del elemento
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
lista[[1]][,"mpg"] # dentro del objeto
## # A tibble: 5 × 1
## mpg
## <dbl>
## 1 21
## 2 21
## 3 22.8
## 4 21.4
## 5 18.7
lista[["tibble_1"]] # Usando el nombre del elemento
## # A tibble: 5 × 11
## mpg cyl disp hp drat wt qsec vs am gear carb
## <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
## 1 21 6 160 110 3.9 2.62 16.5 0 1 4 4
## 2 21 6 160 110 3.9 2.88 17.0 0 1 4 4
## 3 22.8 4 108 93 3.85 2.32 18.6 1 1 4 1
## 4 21.4 6 258 110 3.08 3.22 19.4 1 0 3 1
## 5 18.7 8 360 175 3.15 3.44 17.0 0 0 3 2
tbl = data.table::rbindlist(l = lista , use.names = T)
head(tbl)
## mpg cyl disp hp drat wt qsec vs am gear carb
## <num> <num> <num> <num> <num> <num> <num> <num> <num> <num> <num>
## 1: 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4
## 2: 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4
## 3: 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1
## 4: 21.4 6 258 110 3.08 3.215 19.44 1 0 3 1
## 5: 18.7 8 360 175 3.15 3.440 17.02 0 0 3 2
## 6: 18.1 6 225 105 2.76 3.460 20.22 1 0 3 1
class(tbl)
## [1] "data.table" "data.frame"
Es nuestra manera de decirle a R, donde debería buscar los datos que vamos a necesitar.
Puede pintar sobre la consola de r la ubicación del
directorio de trabajo y los archivo almacenados en e directorio de
trabajo:
## obtener ruta al repositorio actual
getwd()
## [1] "/Users/eduardmartinez/Library/CloudStorage/Dropbox/Teaching/Recursos R/intro-r"
## ver archivos en el directorio de trabajo
list.files()
## [1] "images" "index.html" "index.Rmd" "input" "pics"
## [6] "proj.Rproj" "styles.css"
Puede cambiar el directorio de trabajo usando la función
setwd():
setwd("escribir aquí la ruta al nuevo directorio de trabajo")
Los proyectos son una manera alternativa de lidiar con la ruta de trabajo. Los proyectos permiten empaquetar datos y código en una especie de contenedor en el que se fija un directorio de trabajo relativo a cada equipo; haciendo más sencillo el proceso lectura y escritura de datos.
Puede crear un proyecto desde cero o puede asociar una carpeta existente a un proyecto:
Cuándo se abre el archivo .Rproj
automáticamente Rstudio establece como directorio de trabajo la carpeta
que contiene el archivo .Rproj.
1. Descargue el archivo Week-03
2. Descomprima el archivo en su equipo.
3. Cree un proyecto en R que contenga y
nombre la carpeta como desee.
4. Imprima sobre la consola de R la
función getwd() para ver directorio de trabajo.
riorio es una librería que simplifica el proceso de
importar, exportar y/o convertir bases de datos desde múltiples
extensiones.
| File_type | Importar | Exportar |
|---|---|---|
.csv
|
import() | export() |
.txt
|
import() | export() |
.xls, .xlsx
|
import() | export() |
.dta
|
import() | export() |
rds
|
import() | export() |
Esta función utiliza los mismos argumentos para diferentes formatos.
file = “” Dirección de directorio
sep = Separador de columnas (en .csv y
.txt)
skip = Desde cuál fila leer la base de
datos
sheet = Cuál hoja leer
header = T/F Nombres de las columnas en primera
fila
skipNul = T/F Se debe aceptar los no
elementos.
Leer desde un formato .csv:
data_csv = import(file="input/datos censo colombia.csv" , skip=6 , encoding="UTF-8")
## codigo_divipola NOMBRE DEPARTAMENTO poblacion_en_hogares poblacion_en_lea
## 1 00 Total Nacional 43835324 329093
## 2 05 Antioquia 5931492 43296
Leer desde un formato .xlsx
data_xls = import(file="input/poblacion dane.xlsx" , skip=9)
## DEPARTAMENTO MUNICIPIO MES ARMAS MEDIOS
## 1 AMAZONAS LETICIA (CT) ENERO ARMA BLANCA / CORTOPUNZANTE
## 2 AMAZONAS LETICIA (CT) MARZO ARMA BLANCA / CORTOPUNZANTE
Leer desde una url en internet:
data_url = import(file="https://www.datos.gov.co/resource/8dar-v8rj.json")
export(x=data_url, file="output/datos censo magdalena.csv")
export(x=data_url , file="output/datos censo magdalena.xlsx")
export(x=data_url , file="output/datos censo magdalena.rds")
convert() es la combinación de las funciones
import() y export(), ya que permite cambiar la
extensión de un archivo sin la necesidad de crear un objeto en R
convertir .csv -> .xlsx
convert(in_file = "input/datos censo colombia.csv" , out_file="output/datos censo colombia.xlsx")
convertir .xlsx -> .rds
convert(in_file="input/poblacion dane.xlsx" , out_file="output/poblacion dane.rds")
.rds es hasta 16 veces más eficiente que el formato .csv.
W. N. Venables, D. M. Smith, 2021. An Introduction to R [Ver aquí]
Colin Gillespie and Robin Lovelace, 2017. Efficient R Programming, A Practical Guide to Smarter Programming [Ver aquí]